/**
 ******************************************************************************
 * @file           : bsp_usart.h
 * @brief          : USART Driver Header File (STM32F4xx)
 ******************************************************************************
 * @attention
 *
 * USART通用串口驱动程序头文件
 * 支持中断接收和阻塞发送
 * 支持printf重定向
 * 提供完整的错误处理机制
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_USART_H
#define __BSP_USART_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdio.h>
#include "./BSP/USART/bsp_usart_config.h"

/* Exported types ------------------------------------------------------------*/

/**
 * @brief USART状态枚举
 */
typedef enum
{
    USART_STATE_IDLE = 0,       /*!< 空闲状态 */
    USART_STATE_TX,             /*!< 发送状态 */
    USART_STATE_RX,             /*!< 接收状态 */
    USART_STATE_ERROR           /*!< 错误状态 */
} USART_State_e;

/**
 * @brief USART错误码枚举
 */
typedef enum
{
    USART_OK = 0,               /*!< 成功 */
    USART_ERROR_PARAM,          /*!< 参数错误 */
    USART_ERROR_TIMEOUT,        /*!< 超时错误 */
    USART_ERROR_BUSY,           /*!< 总线忙 */
    USART_ERROR_OVERFLOW        /*!< 缓冲区溢出 */
} USART_Error_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* 初始化函数 */
void usart_init(uint32_t baudrate);                             /*!< USART初始化 */
void usart_deinit(void);                                        /*!< USART反初始化 */

/* 数据收发函数 */
USART_Error_e usart_send(const uint8_t *data, uint16_t len);    /*!< 发送数据 */
USART_Error_e usart_send_string(const char *str);               /*!< 发送字符串 */
USART_Error_e usart_receive(uint8_t *data, uint16_t *len);      /*!< 接收数据 */
uint16_t usart_get_rx_count(void);                              /*!< 获取接收数据量 */
void usart_flush_rx(void);                                      /*!< 清空接收缓冲区 */

/* 状态查询函数 */
USART_State_e usart_get_state(void);                            /*!< 获取USART状态 */
uint8_t usart_is_rx_ready(void);                                /*!< 检查是否有数据 */
uint8_t usart_is_line_ready(void);                              /*!< 检查是否有完整行(\r\n) */

/* 调试接口 */
void usart_print_status(void);                                  /*!< 打印USART状态 */

#ifdef __cplusplus
}
#endif

#endif /* __BSP_USART_H */
